package template;

// 抽象类（定义冲泡流程）
abstract class Beverage {
    // 模板方法（定义饮料冲泡流程，不允许子类修改）
    public final void prepareDrink() {
        boilWater();		//烧水
        brew();				//制作
        pourIntoCup();		//倒入杯中
        addCondiments();	//加调料
    }

    private void boilWater() {
        System.out.println("1. 煮沸水...");
    }

    // 由子类实现的步骤
    protected abstract void brew();

    private void pourIntoCup() {
        System.out.println("3. 倒入杯中...");
    }

    // 由子类实现的步骤
    protected abstract void addCondiments();
}

// 具体类：茶
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("2. 泡茶叶...");
    }

    @Override
    protected void addCondiments() {
        System.out.println("4. 加柠檬...");
    }
}

// 具体类：咖啡
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("2. 冲泡咖啡...");
    }

    @Override
    protected void addCondiments() {
        System.out.println("4. 加糖和牛奶...");
    }
}

public class TemplateMethodTest {
    public static void main(String[] args) {
        System.out.println("制作茶：");
        Beverage tea = new Tea();
        tea.prepareDrink();
        //制作茶：
        //1. 煮沸水...
        //2. 泡茶叶...
        //3. 倒入杯中...
        //4. 加柠檬...

        System.out.println("\n制作咖啡：");
        Beverage coffee = new Coffee();
        coffee.prepareDrink();
        //制作咖啡：
        //1. 煮沸水...
        //2. 冲泡咖啡...
        //3. 倒入杯中...
        //4. 加糖和牛奶...
    }
}